package com.unione.unione_protocol.serial_port

import com.unione.unione_base.util.ByteUtils
import com.unione.unione_base.util.CrcUtil
import com.unione.unione_protocol.serial_port.SerialPortProtocolConstant.data_max_value
import com.unione.unione_protocol.serial_port.SerialPortProtocolConstant.fix_end
import com.unione.unione_protocol.serial_port.SerialPortProtocolConstant.no_action
import com.unione.unione_protocol.serial_port.SerialPortProtocolConstant.robot_control
import com.unione.unione_protocol.serial_port.SerialPortProtocolConstant.sync_code
import com.unione.unione_protocol.serial_port.SerialPortProtocolConstant.valid_data_len


object UnioneSerialPortProtocol {

    /**
     *  请求帧
     */
    fun getRobotControlRequest(headAngle: Int, cmd: Int): ByteArray {
        val byteList = mutableListOf<Byte>()
        byteList.addAll(ByteUtils.to2Bytes(sync_code).toList()) // 1 2
        byteList.add(robot_control.toByte()) // 3
        byteList.add(valid_data_len.toByte()) // 4
        byteList.add(cmd.toByte()) //5
        byteList.addAll(ByteUtils.to2BytesMin(data_max_value).toList()) //6 7
        byteList.addAll(ByteUtils.to2BytesMin(data_max_value).toList()) //8 9
        byteList.addAll(ByteUtils.to2BytesMin(headAngle).toList())//10 11
        byteList.add(no_action.toByte())//12

        val dataList = getDataByteList(headAngle, cmd)
        val crcByteArray = mutableListOf<Byte>()
        crcByteArray.addAll(dataList)
        byteList.addAll(getCrcByteData(crcByteArray).toList())// 13 14
        byteList.add(fix_end.toByte()) //15
        return byteList.toByteArray()
    }

    fun getTestRequest(headAngle: Int, cmd: Int): ByteArray {
        val byteList = mutableListOf<Byte>()
        byteList.add(0xAA.toByte())
        byteList.add(0x55.toByte())
        byteList.add(robot_control.toByte())
        byteList.add(valid_data_len.toByte())
        byteList.add(0x02.toByte())
        byteList.add(0x7F.toByte())
        byteList.add(0xFF.toByte())
        byteList.add(0x7F.toByte())
        byteList.add(0xFF.toByte())
        byteList.add(0x7F.toByte())
        byteList.add(0xFF.toByte())
        byteList.add(0x00.toByte())
        byteList.add(0x31.toByte())
        byteList.add(0x57.toByte())
        byteList.add(0x0D.toByte())
        return byteList.toByteArray()
    }

    private fun getDataByteList(headAngle: Int, cmd: Int): List<Byte> {
        val byteList = mutableListOf<Byte>()
        byteList.add(robot_control.toByte())
        byteList.add(valid_data_len.toByte())
        byteList.add(cmd.toByte())
        byteList.addAll(ByteUtils.to2BytesMin(data_max_value).toList())
        byteList.addAll(ByteUtils.to2BytesMin(data_max_value).toList())
        byteList.addAll(ByteUtils.to2BytesMin(headAngle).toList())
        byteList.add(no_action.toByte())
        return byteList
    }

    /**
     *  响应帧
     */
    fun getRobotControlResponse(byteArray: ByteArray) {

    }


    /**
     *  crc-16 校验
     */
    private fun getCrcByteData(byteList: List<Byte>): ByteArray {
        return CrcUtil.getCRC16(byteList.toByteArray())
    }


}